package com.atbeijing.bigdata.spark.core.rdd.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Spark08_Oper_Transform {

    def main(args: Array[String]): Unit = {

        val conf = new SparkConf().setMaster("local[*]").setAppName("TransformOperator")
        val sc = new SparkContext(conf)

        // TODO 算子 - 转换 - sample

        // TODO sample用于在数据集中随机抽取数据
        // 1. 抽取数据后，这个数据放回，重新抽取
        // 2. 抽取数据后，这个数据不放回，不会重新抽取

        val rdd = sc.makeRDD(List(1,2,3,4,5,6,7,8,9,10))
        // DB => 10000 Data
        // Memory => 10000 User Object

        // 1 Data => 1 User => 1K * 10000
        // 100 Data => 100 User => 1M * 40

        // sample方法第一个参数表示数据抽取后是否放回
        //       true：放回，false : 不放回
        // sample方法第二个参数依赖于第一个参数
        //     如果第一个参数为false，第二个参数表示每个数据被抽取的几率, 取值为0 ~ 1之间
        //     如果第一个参数为true，第二个参数表示每个数据预期被抽取的数据, 取值大于1
        // sample方法第三个参数seed : 随机数种子
        //     随机数不随机 ： 1 => 随机算法 => a => 随机算法 => 7
        //                  1 => Hash算法 => X
        //                  1 => Hash算法 => X
        //val rdd1: RDD[Int] = rdd.sample(false, .5)
        val rdd1: RDD[Int] = rdd.sample(true, 1)
        rdd1.collect().foreach(println)

        // 数据倾斜
        // 10000 => 100 ( 97 a)
        // 10000 => 100 ( 98 a)
        // 10000 => 100 ( 96 a)
        // 10000 => 100 ( 97 a)




        sc.stop()

    }
}
